package Server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JButton;

import Server.ClientThread;
import Server.HaggisRandom;
import Commons.Karte;
import Client.GUI.SpielmodusGUI;
import Commons.Spielzustand;

/**
 * 
 * @author Alex
 *
 */

public class VerbindungsAufbauServer {

	ArrayList<ClientThread> clientlist = new ArrayList<ClientThread>();
	public int port;
	public int Ziellinie;
	int i = 0;
	String Threadname;
	private Spiellogik spiellogik = new Spiellogik();


	public Spiellogik getSpiellogik() {
		return spiellogik;
	}

	//todo synchronized
	public synchronized void  setSpiellogik(Spiellogik spiellogik) {
		this.spiellogik = spiellogik;
	}

	public VerbindungsAufbauServer(int port, int Ziellinie) {
		this.port = port;
		this.Ziellinie = Ziellinie;
		this.clientlist = new ArrayList<ClientThread>();
		this.spiellogik.getSpielzustand();
		this.spiellogik.getSpielzustand().setZiellinie(Ziellinie);
		
	}

	public void runServer() throws Exception {
		ServerSocket serverSocket = new ServerSocket(SpielmodusGUI.getPorttextfield());
		System.out.println("Server up & ready for connections");

		while (clientlist.size() <= 1) {
			i++;
			Socket socket = serverSocket.accept();
			String Threadname = "Thread " + i;
			String Username1 = SpielmodusGUI.getUsernametextfield();
			ClientThread clientthread = new ClientThread(this, socket, Threadname, Username1);
			clientthread.start();
			System.out.println("clientthread started");
			clientlist.add(clientthread);
			System.out.println("client added");
			if (clientlist.size() == 1) {
				System.out.println("waiting for another client");
			}

		}

	}

	public void broadcast(Spielzustand spielzustand) throws IOException, InterruptedException {
		int i = 1;
		for (ClientThread c : clientlist) {
			
			try {
			System.out.println("broadcasting done by " + c.getThreadname());
			c.objectOutputStream.writeObject(spielzustand);
			System.out.println("the cards have been broadcasted");

			System.out.println("message-broadcast sent:"+spielzustand);
			}
			catch (Exception e)  { e.printStackTrace(); }
			i++;
		}
	}
	
	public void broadcast2(Spielzustand spielzustand) throws IOException, InterruptedException {
		int i = 1;
		for (ClientThread c : clientlist) {
			
			try {
				System.out.println("------------------- HALL0 JButton Serverseite Anfang--------------------------");
				for(JButton jbutton : spielzustand.getSpieler(0).getGespielteKarten())
				{
					System.out.println("Zuspielenden Karten " +jbutton.getIcon());
					
				}
				System.out.println("------------------- HALL0 JButton Serverseite Ende--------------------------");
			System.out.println("broadcasting done by " + c.getThreadname());
			c.objectOutputStream.writeObject(spielzustand);
			System.out.println("the cards have been broadcasted");
			
			System.out.println("message-broadcast sent:"+spielzustand);
			}
			catch (Exception e)  { e.printStackTrace(); }
			i++;
		}
	}
	
	


	
}
